"""
@name : 16
@author : qhy
@projectname: tiannongbabu
"""

#1、输入数字n，输出n天前的日期（time或者datatime模块）
# import datetime
# n = int(input("请输入一个数字："))
# #获取现在的时间
# now = datetime.datetime.now()
# delta = datetime.timedelta(days=int(n))
# before_day = now - delta
# print(before_day)

#2、输出指定文件夹下有哪些文件或文件夹（实现ls命令， os）
# import os
# def get_ls(path):
#返回一个列表，其中包括 path 对应的目录下的内容
 # for i in os.listdir(path):
 #        print(i)
# get_ls("C:\\Users\\ACER\\Desktop\\teacher-tlbb")

#3、列表去重，并且从小到大排序
# list1 = [1,18,6,88,'a',1,3,6,'b','a' ]
#集合去重
# a = set(list1)
# print(list(a))

#4、如何在一个函数内部修改全局变量
# names = 'yanyan'
# def change_name():
    # 全局范围内使用函数变量
#     global names
#     names = 'quanquan'
#     print(names)
# change_name()
# print(names)

#5、如何跨模块共享全局变量
# 在单个程序中跨模块共享信息的规范方法是创建一个特殊模块（通常称为config或cfg）
# 只需在应用程序的所有模块中导入配置模块；然后该模块可用作全局名称。

#6、python的基本数据类型有哪些？
#数字，字符串，布尔类型，常量，等

#7、python中生成随机整数（1-10），随机小数（1-10），随机小数（0-1）的方法
# import random
#生成随机整数
# num1 = random.randint(1,10)
#生成随机小数
# num2 = random.uniform(1,10)
#生成（0，1）随机小数
# num3 = random.random()
# print(num1,num2,num3)

#8、python中哪些是可变数据类型，哪些是不可变数据类型
#可变数据类型：列表，字典，集合
#不可变数据类型：元组，字符串,整型，浮点型

#9、a+=1与a=a+1有什么区别
#a=a+1，表示一个新的对象，新的对象名字还是a，但是指向的内存地址已经变了
#a+=1对于有些对象的操作是表示原来的对象，对有些对象的操作是生成了一个新对象,
#而list对象，可变对象，+=操作、append操作、extend操作，都是在原对象上操作,
#不可变对象tuple1，操作完后，内存地址已经发生变化，生成一个新的对象

#10、什么是pep8？说出5点它的标准
# 1)编码
# 如无特殊情况，文件一律使用utf-8编码
# 如无特殊情况，文件头部必须添加# -*- coding:utf-8 -*- 标志
# 2)代码
# 统一使用四个空格缩进
# 每行代码不超过80个字符
# 自然语言使用双引号，如input里面，或者错误信息，正则表达式使用原生的双引号r" ",
# 机器标识使用单引号，如dict里面的key，因此代码里面多数应该使用单引号。
# 文档字符串使用三个双引号。""" """
# 3)空行
# 模块级函数和类定义之间空两行
# 类成员函数之间空一行
# 可以使用多个空行分隔多组相关函数
# 函数中可以用空行分隔出逻辑相关的代码
# 4)import语句
# import 语句应当分行书写
# import语句应当使用absolute import
# import语句应当放在文件头部，置于模块说明及docstring之后，全局变量之前
# import语句应该按照顺序排列，每组之间用一个空格分隔，按照内置模块，第三方模块，自己所写的模块调用顺序，同时每组内部按照字母表顺序排列
# 5)空格
# 在二元运算符两边各空一格：[=, - ,+ =, > , in , is ,not , and]
# i = i + 1x= x * x + 2c= (a + b) * (a - b)
# 函数的参数列表中，","之后要有空格,默认值等号两边不要添加空格，左括号之后，右括号之前不要有空格
# defcomplex(real, image=0):pass

#11、给定一个字符串，找出字符串第一个重复的字符
# str1 = 'quanhongyan'
# lis_same = []
# for i in str1:
#每次循环的i就加到列表中去
#     lis_same.append(i)
#列表中的数量第一个等于2的，就符合题意了
#     if lis_same.count(i)==2:
#             print(f"第一个重复的字符为：{i}")
#             break

#12、简述深拷贝与浅拷贝
##深浅拷贝：容器里包含可变数据类型的情况才会有深浅拷贝的区别
#主要是针对可变容器类型里面包含可变容器类型的情况
#容器里面包容器
#浅拷贝：只会拷贝第一层地址
#深拷贝：会拷贝每一层的值


#13、简述python内存机制
#python内存管理
#引用计数为主、分代回收和标记清除为辅的垃圾回收方式、进行内存回收管理
#还引用了小整型缓冲区及常用字符串驻留区的方式进行内存分配管理


#14、使用python实现冒泡排序，快速排序
#####冒泡排序（从第一个位置开始，相邻的依次比较，大的放后面）
# def top_num(bubble):
#要循环bubble数量-1次
#     for i in range(1, len(bubble)):
#根据下标循环
        # for j in range(0, len(bubble) - i):
#如果前面的数大于后面的数，就要交换位置
#             if bubble[j] > bubble[j + 1]:
#                 bubble[j], bubble[j + 1] = bubble[j + 1], bubble[j]
#     return bubble
#
# bubble = [10, 17, 50, 7]
# print(top_num(bubble))

#####快速排序（左哨兵遇到大的，右哨兵遇到小的，互换位置对应的值，左右哨兵相遇与基准数交换位置）
# def QuickSort(nums, left, right):
    # if left >= right:
    #     return 0
# 选择第一个数作为基准数
#     baseNumber = nums[left]
    #i，j为左右哨兵指针位置
    # i = left
    # j = right
    # while i != j:
        #右哨兵指针先行动，一直往左移，直到找到第一个小于基准数的时候，交换左右指针对应的数
        # while j > i and nums[j] >= baseNumber:
        #     j -= 1
        # if j > i:
        #    nums[i], nums[j] = nums[j], nums[i]
        #左哨兵指针一直往右移，直到找到第一个大于基准数的时候，交换左右指针对应的数
        # while i < j and nums[i] <= baseNumber:
        #     i += 1
        # if i < j:
        #     nums[i], nums[j] = nums[j], nums[i]
            #基准数左边的函数递归
    # QuickSort(nums, left, i - 1)
            # 基准数右边的函数递归
    # QuickSort(nums, i + 1, right)

# nums = [2,11,3,5,6,0]

# QuickSort(nums, 0, len(nums) - 1)
# print(nums)

#15、验证一个字符串是否属于回文（从左到右，从右到左都是一样）
# str1 = 'abc'
# # 将字符串转为列表再判断
# a = list(str1)
# a.reverse()
# b = list(str1)
# # print(b)
# if a == b :
#     print(f"{str1}属于回文哦！")
# else:
#     print(f"{str1}不属于回文哦！")


#16
import requests
import json
#读取weblog文本,并打开文件file1
with open("weblog.txt","r",encoding="gbk")as fp:
    with open("file1", "w", encoding="utf-8")as fp1:
        for line in fp:
            #将获取的每一行字符串以空格分割，再转变成列表，方便后面获取值
            a = line.split(" ")
            import time, datetime
            #ctime是改格式之后的时间
            #[04/Jun/2021:04:00:20
            ctime = datetime.datetime.strptime(a[3], "[%d/%b/%Y:%H:%M:%S")
            # print(type(ctime), str(ctime))
            # 网站请求，目标url
            url = 'https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=%s'%a[0]
            # 向目标url发送get请求
            response = requests.get(url)
            # 打印响应内容
            # print(response.text)
            # 将字符串转换位字典
            dict = json.loads(response.text)
            # print(type(dict))
            reg = dict["data"]["region"]
            isp = dict["data"]["isp"]
            # print(type(ctime))
            # fp1.write(ctime + ',' + reg + ',' + isp + ',' + a[9] + '\n')
#写入文件file1
            # fp1.write(a[0]+ f'{ctime}' + a[9]+'\n')
            fp1.write(str(ctime)+','+reg+','+isp+','+a[9]+'\n')











